package com.nicewuerfel.blockown.database; import com.google.common.base.Optional; import com.nicewuerfel.blockown.Ownable; import com.nicewuerfel.blockown.User; import com.nicewuerfel.blockown.output.Output; import java.io.File; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.RejectedExecutionException; import javax.annotation.Nonnull; public abstract class CachedDatabase extends Database { final CacheAccessor cache; CachedDatabase(Output output, File pluginFolder) { super(output); cache = new CacheAccessor(this, pluginFolder); } @Override public Optional<User> getOwner(@Nonnull Ownable ownable) { return cache.getOwner(ownable); } @Override public void enqueue(DatabaseAction databaseAction) { try { getThreadPool().execute(new CachedDatabaseOperation(this, databaseAction)); } catch (RejectedExecutionException ignored) { getOutput().printConsole("Couldn't execute DatabaseAction"); } } /** * Flush cache data to database. Removes each flushed key-value-pair from the given {@link Map}. * * @param cacheData the cache data * @return true, if successful */ boolean flushDatabase(@Nonnull final Map<Ownable, Optional<User>> cacheData) { Iterator<Entry<Ownable, Optional<User>>> iterator = cacheData.entrySet().iterator(); Entry<Ownable, Optional<User>> owning; while (iterator.hasNext()) { owning = iterator.next(); DatabaseAction action; Ownable key = owning.getKey(); Optional<User> value = owning.getValue(); if (!value.isPresent()) { action = DatabaseAction.newUnownInstance(key); } else { action = DatabaseAction.newOwnInstance(key, value.get()); } if (!setDatabaseOwner(action)) { return false; } iterator.remove(); } return true; } @Override public void close() { cache.close(); super.close(); } }